using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.DataAccessLayer.SqlServerProvider;
using RRHH.Competencias.Entities;

namespace RRHH.Competencias.DataAccessLayer
{
    public class DALSqlServerTarea:IDALTarea
    {

        public DALSqlServerTarea () { }
        

        #region Miembros de IDALTarea
        public List<Tarea> Buscar(long? id, string nombre, string descripcion, bool activo)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Tarea_buscar");

            stored.AgregarParametro("@tarea_id", id, typeof(long));
            stored.AgregarParametro("@nombre", nombre, typeof(string));
            stored.AgregarParametro("@descripcion",descripcion, typeof(string));
            stored.AgregarParametro("@soloActivos", activo, typeof(bool));

            DataTable tareas = stored.ExecuteDataTable();

            return this.CargarLista(tareas);
        }
        #endregion

        #region Miembros de IDALABM<Tarea>
        public void Completar(Tarea itemCompletar)
        {
            List<Tarea> lstTareas = new List<Tarea>();
            lstTareas = Buscar(itemCompletar.Id, itemCompletar.Nombre, itemCompletar.Descripcion, false);

            if (lstTareas.Count > 0)
            {
                itemCompletar.Id = lstTareas[0].Id;
                itemCompletar.Nombre = lstTareas[0].Nombre;
                itemCompletar.Descripcion = lstTareas[0].Descripcion;
            }
            else
            {
                itemCompletar = null;
            }
            itemCompletar.Capacidades.Clear();
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Tarea_buscarCapacidades");
            stored.AgregarParametro("@tarea_id", itemCompletar.Id);

            DataTable tablaCapacidades = stored.ExecuteDataTable();

            if (tablaCapacidades != null && tablaCapacidades.Rows.Count > 0)
            {
                foreach (DataRow fila in tablaCapacidades.Rows)
                {
                    Capacidad capacidad = new Capacidad();
                    capacidad.Id = Convert.ToInt64(fila["capacidad_id"]);
                    capacidad.Nivel = new NivelCapacidad(Convert.ToInt64(fila["nivel"]), string.Empty, string.Empty);
                    capacidad.Prioridad = new PrioridadCapacidad(Convert.ToInt64(fila["prioridad"]), string.Empty, string.Empty);

                    itemCompletar.AgregarCapacidad(capacidad);
                }
            }
        }

        public void Guardar(Tarea item)
        {
            DALSqlServerConnection conexion = new DALSqlServerConnection();
            SqlTransaction transaccion = null;

            using (SqlConnection connection = conexion.Conexion)
            {
                try
                {
                    transaccion = connection.BeginTransaction();
                    
                    using (SqlCommand command = connection.CreateCommand())
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandText = "PA_ADUS_Tarea_insertar";
                        command.Transaction = transaccion;
                        command.Parameters.AddWithValue("@nombre", item.Nombre);
                        command.Parameters.AddWithValue("@descripcion", item.Descripcion);

                        item.Id = Convert.ToInt64(command.ExecuteScalar());

                        if (item.ContarCapacidades() > 0)
                        {
                            command.CommandText = "PA_ADUS_Tarea_insertarCapacidades";

                            foreach (Capacidad capacidad in item.Capacidades)
                            {
                                command.Parameters.Clear();

                                command.Parameters.AddWithValue("@tarea_id", item.Id);
                                command.Parameters.AddWithValue("@capacidad_id", capacidad.Id);
                                command.Parameters.AddWithValue("@nivel", capacidad.Nivel.Id);
                                /*
                                if(capacidad.Prioridad != null)
                                    command.Parameters.AddWithValue("@prioridad", capacidad.Prioridad.Id);
                                else
                                    command.Parameters.AddWithValue("@prioridad", DBNull.Value);
                                */
                                command.ExecuteNonQuery();
                            }
                        } 
                    }

                    transaccion.Commit();
                }
                catch (Exception ex)
                {
                    if (transaccion != null) transaccion.Rollback();     
                    throw new DALException(ex.Message);
                }
            }
        }

        public void GuardarOActualizar(Tarea item)
        {
            throw new DALException("The method or operation is not implemented.");
        }

        public void Actualizar(Tarea item)
        {
            DALSqlServerConnection conexion = new DALSqlServerConnection();
            SqlTransaction transaccion = null;

            using (SqlConnection connection = conexion.Conexion)
            {
                try
                {
                    transaccion = connection.BeginTransaction();

                    using (SqlCommand command = connection.CreateCommand())
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandText = "PA_ADUS_Tarea_actualizar";
                        command.Transaction = transaccion;
                        command.Parameters.AddWithValue("@tarea_id", item.Id);
                        command.Parameters.AddWithValue("@nombre", item.Nombre);
                        command.Parameters.AddWithValue("@descripcion", item.Descripcion);

                        command.ExecuteNonQuery();
                        command.Parameters.Clear();

                        command.CommandText = "PA_ADUS_Tarea_borrarCapacidades";
                        command.Parameters.AddWithValue("@tarea_id", item.Id);

                        command.ExecuteNonQuery();
                        command.Parameters.Clear();

                        if (item.ContarCapacidades() > 0)
                        {
                            command.CommandText = "PA_ADUS_Tarea_actualizarCapacidades";

                            foreach (Capacidad capacidad in item.Capacidades)
                            {
                                command.Parameters.Clear();

                                command.Parameters.AddWithValue("@tarea_id", item.Id);
                                command.Parameters.AddWithValue("@capacidad_id", capacidad.Id);
                                command.Parameters.AddWithValue("@nivel", capacidad.Nivel.Id);
                                //command.Parameters.AddWithValue("@prioridad", capacidad.Prioridad.Id);

                                command.ExecuteNonQuery();
                            }
                        }
                    }

                    transaccion.Commit();
                }
                catch (Exception ex)
                {
                    if (transaccion != null) transaccion.Rollback();
                    throw new DALException(ex.Message);
                }
            }
        }

        public void Borrar(Tarea item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Tarea_borrar");

            stored.AgregarParametro("@tarea_id", item.Id);

            stored.ExecuteNonQuery();
        }

        public void Activar(Tarea item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Tarea_activar");
            stored.AgregarParametro("@tarea_id", item.Id);
            stored.ExecuteNonQuery(); 
        }

        public void Desactivar(Tarea item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Tarea_desactivar");
            stored.AgregarParametro("@tarea_id", item.Id);
            stored.ExecuteNonQuery(); 
        }

        public List<Tarea> BuscarTodos()
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Tarea_buscarTodos");

            DataTable dtTareas = new DataTable();
            dtTareas = stored.ExecuteDataTable();

            return CargarLista(dtTareas);
        }
        #endregion
       
        private List<Tarea> CargarLista(DataTable tareas)
        {
            List<Tarea> listaTareas = new List<Tarea>();

            if (tareas == null || tareas.Rows.Count == 0) return listaTareas;

            foreach (DataRow fila in tareas.Rows)
            {
                Tarea tarea = new Tarea(Convert.ToInt64(fila["tarea_id"]),
                    fila["nombre"].ToString(),
                    fila["descripcion"].ToString());
                if (!fila["fechaBaja"].Equals(DBNull.Value)) 
                    tarea.FechaBaja = Convert.ToDateTime(fila["fechaBaja"]);
                listaTareas.Add(tarea);
            }

            return listaTareas;
        }
    }
}
